from sqlalchemy import create_engine
import matplotlib.pyplot as plt
import logging
import constant
from IndexDailyData import painter_index
from CnPpiData import query_cn_ppi
"""
根据已有数据探究指数，行业与PPI数据相关性
相关拆线图
测试得：指数与PPI有明显关系，具体行业更为明显
"""
# 日志
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
logging.debug('------------------ Start of program ---------------------')
# 初始化数据库连接:
engine = create_engine(
    constant.get_db_path(),
    max_overflow=0,   # 超过连接池大小外最多创建的连接数
    pool_size=5,      # 连接池大小
    pool_timeout=30,  # 连接池中没有线程最多等待时间，否则报错
    pool_recycle=-1,  # 多久之后对连接池中的连接进行回收（重置）-1不回收
)





"""
画图
"""
def painter_cn_ppi(engine_, query_start_, query_end_):
    """
    PPI数据相关
    :param engine_:
    :param query_start_:
    :param query_end_:
    :return:
    """
    logging.debug('------------------- 获取数据开始 -------------------')
    cn_ppi_list = query_cn_ppi(engine_, query_start_, query_end_)
    logging.debug('------------------- 获取数据完成 -------------------')

    logging.debug('------------------- 画图开始 -------------------')
    plt.figure("PPI相关")  # 生成图形后的标题
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    x6_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k6_ = cn_ppi_list.loc[:, 'ppi_yoy']  # 线6的纵坐标
    x7_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k7_ = cn_ppi_list.loc[:, 'ppi_mp_yoy']  # 线7的纵坐标
    x8_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k8_ = cn_ppi_list.loc[:, 'ppi_mp_qm_yoy']  # 线7的纵坐标
    x9_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k9_ = cn_ppi_list.loc[:, 'ppi_mp_rm_yoy']  # 线7的纵坐标
    x10_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k10_ = cn_ppi_list.loc[:, 'ppi_mp_p_yoy']  # 线7的纵坐标
    x11_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k11_ = cn_ppi_list.loc[:, 'ppi_cg_yoy']  # 线7的纵坐标
    x12_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k12_ = cn_ppi_list.loc[:, 'ppi_cg_f_yoy']  # 线7的纵坐标
    x13_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k13_ = cn_ppi_list.loc[:, 'ppi_cg_c_yoy']  # 线7的纵坐标
    x14_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k14_ = cn_ppi_list.loc[:, 'ppi_cg_adu_yoy']  # 线7的纵坐标
    x15_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k15_ = cn_ppi_list.loc[:, 'ppi_cg_dcg_yoy']  # 线7的纵坐标
    plt.plot(x6_, k6_, color='blue', label="全部工业品", linewidth=1)
    plt.plot(x7_, k7_, color='r', label="生产资料", linewidth=1)
    plt.plot(x8_, k8_, color='g', label="生产：采掘业", linewidth=1)
    plt.plot(x9_, k9_, color='orange', label="生产：原料业", linewidth=1)
    plt.plot(x10_, k10_, color='pink', label="生产：加工业", linewidth=1)
    plt.plot(x11_, k11_, color='black', label="生活资料", linewidth=1)
    plt.plot(x12_, k12_, color='y', label="生活：食品类", linewidth=1)
    plt.plot(x13_, k13_, color='gray', label="生活：衣着类", linewidth=1)
    plt.plot(x14_, k14_, color='#BF00FF', label="生活：一般日用品类", linewidth=1)
    plt.plot(x15_, k15_, color='#0B4C5F', label="生活：耐用消费品类", linewidth=1)
    plt.xlabel("DATE")  # 横坐标名字
    plt.ylabel("PPI")  # 纵坐标名字
    plt.legend(loc="best")  # 图例
    plt.show()
    logging.debug('------------------- 画图结束  -------------------')

def muti_painter_index_cn_ppi(engine_, query_start_, query_end_, query_cpi_start_, query_cpi_end_):
    logging.debug('------------------- 获取数据开始 -------------------')
    plt.figure("指数与PPI相关")  # 生成图形后的标题
    plt.subplot(211)
    plt.title('指数相关', fontsize=12)
    painter_index(engine_, query_start, query_end, plt)

    plt.subplot(212)
    plt.title('PPI同比相关', fontsize=12)
    cn_ppi_list = query_cn_ppi(engine_, query_cpi_start_, query_cpi_end_)
    x6_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k6_ = cn_ppi_list.loc[:, 'ppi_yoy']  # 线6的纵坐标
    x7_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k7_ = cn_ppi_list.loc[:, 'ppi_mp_yoy']  # 线7的纵坐标
    x8_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k8_ = cn_ppi_list.loc[:, 'ppi_mp_qm_yoy']  # 线7的纵坐标
    x9_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k9_ = cn_ppi_list.loc[:, 'ppi_mp_rm_yoy']  # 线7的纵坐标
    x10_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k10_ = cn_ppi_list.loc[:, 'ppi_mp_p_yoy']  # 线7的纵坐标
    x11_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k11_ = cn_ppi_list.loc[:, 'ppi_cg_yoy']  # 线7的纵坐标
    x12_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k12_ = cn_ppi_list.loc[:, 'ppi_cg_f_yoy']  # 线7的纵坐标
    x13_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k13_ = cn_ppi_list.loc[:, 'ppi_cg_c_yoy']  # 线7的纵坐标
    x14_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k14_ = cn_ppi_list.loc[:, 'ppi_cg_adu_yoy']  # 线7的纵坐标
    x15_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k15_ = cn_ppi_list.loc[:, 'ppi_cg_dcg_yoy']  # 线7的纵坐标
    plt.plot(x6_, k6_, color='blue', label="全部工业品", linewidth=1)
    plt.plot(x7_, k7_, color='r', label="生产资料", linewidth=1)
    plt.plot(x8_, k8_, color='g', label="生产：采掘业", linewidth=1)
    plt.plot(x9_, k9_, color='orange', label="生产：原料业", linewidth=1)
    plt.plot(x10_, k10_, color='pink', label="生产：加工业", linewidth=1)
    plt.plot(x11_, k11_, color='black', label="生活资料", linewidth=1)
    plt.plot(x12_, k12_, color='y', label="生活：食品类", linewidth=1)
    plt.plot(x13_, k13_, color='gray', label="生活：衣着类", linewidth=1)
    plt.plot(x14_, k14_, color='#BF00FF', label="生活：一般日用品类", linewidth=1)
    plt.plot(x15_, k15_, color='#0B4C5F', label="生活：耐用消费品类", linewidth=1)
    plt.xlabel("DATE", fontsize=8)  # 横坐标名字
    plt.ylabel("PPI", fontsize=8)  # 纵坐标名字
    # 设置坐标轴刻度标记的大小
    plt.tick_params(axis='both', which='major', labelsize=8)
    plt.legend(loc="best")  # 图例
    # 设置坐标轴刻度标记的大小
    plt.tick_params(axis='both', labelsize=8)
    plt.tight_layout()  # 设置默认的间距，调整整体空白
    plt.subplots_adjust(wspace=0.5, hspace=0.5)  # 调整子图间距
    logging.debug('------------------- 画图结束  -------------------')
    plt.show()


def muti_painter_diff_ppi(engine_, query_cpi_start_, query_cpi_end_):
    logging.debug('------------------- 获取数据开始 -------------------')
    cn_ppi_list = query_cn_ppi(engine_, query_cpi_start_, query_cpi_end_)
    logging.debug('------------------- 获取数据完成 -------------------')
    logging.debug('------------------- 画图开始 -------------------')
    plt.figure("PPI相关")  # 生成图形后的标题
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    plt.subplot(311)  # 设置绘图区域
    plt.title('PPI环比相关', fontsize=12)

    x6_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k6_ = cn_ppi_list.loc[:, 'ppi_mom']  # 线6的纵坐标
    x7_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k7_ = cn_ppi_list.loc[:, 'ppi_mp_mom']  # 线7的纵坐标
    x8_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k8_ = cn_ppi_list.loc[:, 'ppi_mp_qm_mom']  # 线7的纵坐标
    x9_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k9_ = cn_ppi_list.loc[:, 'ppi_mp_rm_mom']  # 线7的纵坐标
    x10_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k10_ = cn_ppi_list.loc[:, 'ppi_mp_p_mom']  # 线7的纵坐标
    x11_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k11_ = cn_ppi_list.loc[:, 'ppi_cg_mom']  # 线7的纵坐标
    x12_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k12_ = cn_ppi_list.loc[:, 'ppi_cg_f_mom']  # 线7的纵坐标
    x13_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k13_ = cn_ppi_list.loc[:, 'ppi_cg_c_mom']  # 线7的纵坐标
    x14_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k14_ = cn_ppi_list.loc[:, 'ppi_cg_adu_mom']  # 线7的纵坐标
    x15_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k15_ = cn_ppi_list.loc[:, 'ppi_cg_dcg_mom']  # 线7的纵坐标
    plt.plot(x6_, k6_, color='blue', label="全部工业品", linewidth=1)
    plt.plot(x7_, k7_, color='r', label="生产资料", linewidth=1)
    plt.plot(x8_, k8_, color='g', label="生产：采掘业", linewidth=1)
    plt.plot(x9_, k9_, color='orange', label="生产：原料业", linewidth=1)
    plt.plot(x10_, k10_, color='pink', label="生产：加工业", linewidth=1)
    plt.plot(x11_, k11_, color='black', label="生活资料", linewidth=1)
    plt.plot(x12_, k12_, color='y', label="生活：食品类", linewidth=1)
    plt.plot(x13_, k13_, color='gray', label="生活：衣着类", linewidth=1)
    plt.plot(x14_, k14_, color='#BF00FF', label="生活：一般日用品类", linewidth=1)
    plt.plot(x15_, k15_, color='#0B4C5F', label="生活：耐用消费品类", linewidth=1)
    plt.xlabel("DATE", fontsize=8)  # 横坐标名字
    plt.ylabel("PPI环比", fontsize=8)  # 纵坐标名字

    plt.ylabel('点位', fontsize=8)
    plt.xlabel('时间', fontsize=8)
    # 设置坐标轴刻度标记的大小
    plt.tick_params(axis='both', labelsize=8)
    plt.legend(loc="best")  # 图例

    plt.subplot(312)
    plt.title('PPI同比相关', fontsize=12)
    '''
    plt.scatter(xlist, ylist, edgecolor='r', c='g', s=150)
    其中参数edgecolor表示边缘的颜色，此处设置为红色；参数c表示内部的颜色，此处设置为绿色；s表示点的大小；
    （注意：关于参数c还以如下设置c=(value1, value2, value3)，三个value取值范围0到1之间，
    分别表示红绿蓝三原色。plt.scatter(xlist,ylist, edgecolor='k',c=(1, 0, 0), s=150)见后面的图，注意区别）
    '''
    x6_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k6_ = cn_ppi_list.loc[:, 'ppi_yoy']  # 线6的纵坐标
    x7_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k7_ = cn_ppi_list.loc[:, 'ppi_mp_yoy']  # 线7的纵坐标
    x8_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k8_ = cn_ppi_list.loc[:, 'ppi_mp_qm_yoy']  # 线7的纵坐标
    x9_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k9_ = cn_ppi_list.loc[:, 'ppi_mp_rm_yoy']  # 线7的纵坐标
    x10_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k10_ = cn_ppi_list.loc[:, 'ppi_mp_p_yoy']  # 线7的纵坐标
    x11_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k11_ = cn_ppi_list.loc[:, 'ppi_cg_yoy']  # 线7的纵坐标
    x12_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k12_ = cn_ppi_list.loc[:, 'ppi_cg_f_yoy']  # 线7的纵坐标
    x13_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k13_ = cn_ppi_list.loc[:, 'ppi_cg_c_yoy']  # 线7的纵坐标
    x14_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k14_ = cn_ppi_list.loc[:, 'ppi_cg_adu_yoy']  # 线7的纵坐标
    x15_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k15_ = cn_ppi_list.loc[:, 'ppi_cg_dcg_yoy']  # 线7的纵坐标
    plt.plot(x6_, k6_, color='blue', label="全部工业品", linewidth=1)
    plt.plot(x7_, k7_, color='r', label="生产资料", linewidth=1)
    plt.plot(x8_, k8_, color='g', label="生产：采掘业", linewidth=1)
    plt.plot(x9_, k9_, color='orange', label="生产：原料业", linewidth=1)
    plt.plot(x10_, k10_, color='pink', label="生产：加工业", linewidth=1)
    plt.plot(x11_, k11_, color='black', label="生活资料", linewidth=1)
    plt.plot(x12_, k12_, color='y', label="生活：食品类", linewidth=1)
    plt.plot(x13_, k13_, color='gray', label="生活：衣着类", linewidth=1)
    plt.plot(x14_, k14_, color='#BF00FF', label="生活：一般日用品类", linewidth=1)
    plt.plot(x15_, k15_, color='#0B4C5F', label="生活：耐用消费品类", linewidth=1)
    plt.xlabel("DATE", fontsize=8)  # 横坐标名字
    plt.ylabel("PPI同比", fontsize=8)  # 纵坐标名字

    plt.subplot(313)
    plt.title('PPI累比相关', fontsize=12)
    x6_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k6_ = cn_ppi_list.loc[:, 'ppi_accu']  # 线6的纵坐标
    x7_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k7_ = cn_ppi_list.loc[:, 'ppi_mp_accu']  # 线7的纵坐标
    x8_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k8_ = cn_ppi_list.loc[:, 'ppi_mp_qm_accu']  # 线7的纵坐标
    x9_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k9_ = cn_ppi_list.loc[:, 'ppi_mp_rm_accu']  # 线7的纵坐标
    x10_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k10_ = cn_ppi_list.loc[:, 'ppi_mp_p_accu']  # 线7的纵坐标
    x11_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k11_ = cn_ppi_list.loc[:, 'ppi_cg_accu']  # 线7的纵坐标
    x12_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k12_ = cn_ppi_list.loc[:, 'ppi_cg_f_accu']  # 线7的纵坐标
    x13_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k13_ = cn_ppi_list.loc[:, 'ppi_cg_c_accu']  # 线7的纵坐标
    x14_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k14_ = cn_ppi_list.loc[:, 'ppi_cg_adu_accu']  # 线7的纵坐标
    x15_ = cn_ppi_list.loc[:, 'month']  # 点的横坐标
    k15_ = cn_ppi_list.loc[:, 'ppi_cg_dcg_accu']  # 线7的纵坐标
    plt.plot(x6_, k6_, color='blue', label="全部工业品", linewidth=1)
    plt.plot(x7_, k7_, color='r', label="生产资料", linewidth=1)
    plt.plot(x8_, k8_, color='g', label="生产：采掘业", linewidth=1)
    plt.plot(x9_, k9_, color='orange', label="生产：原料业", linewidth=1)
    plt.plot(x10_, k10_, color='pink', label="生产：加工业", linewidth=1)
    plt.plot(x11_, k11_, color='black', label="生活资料", linewidth=1)
    plt.plot(x12_, k12_, color='y', label="生活：食品类", linewidth=1)
    plt.plot(x13_, k13_, color='gray', label="生活：衣着类", linewidth=1)
    plt.plot(x14_, k14_, color='#BF00FF', label="生活：一般日用品类", linewidth=1)
    plt.plot(x15_, k15_, color='#0B4C5F', label="生活：耐用消费品类", linewidth=1)
    plt.xlabel("DATE", fontsize=8)  # 横坐标名字
    plt.ylabel("PPI累比", fontsize=8)  # 纵坐标名字

    # 设置坐标轴刻度标记的大小
    plt.tick_params(axis='both', which='major', labelsize=8)
    plt.legend(loc="best")  # 图例
    # 设置坐标轴刻度标记的大小
    plt.tick_params(axis='both', labelsize=8)
    plt.tight_layout()  # 设置默认的间距，调整整体空白
    plt.subplots_adjust(wspace=0.5, hspace=0.5)  # 调整子图间距
    logging.debug('------------------- 画图结束  -------------------')
    plt.show()



query_start = '20100101'
query_end = '20210331'
query_cpi_start = '201001'
query_cpi_end = '202103'


# painter_index(engine)
# painter_cn_ppi(engine, query_cpi_start, query_cpi_end)
# muti_painter_index_cn_ppi(engine, query_start, query_end, query_cpi_start, query_cpi_end)
muti_painter_diff_ppi(engine, query_cpi_start, query_cpi_end)

